package study.designpattern.adapter.impl;

import java.util.List;

import study.designpattern.adapter.LogDbOperateApi;
import study.designpattern.adapter.LogFileOperateApi;
import study.designpattern.adapter.bean.LogModel;
/**
 * 适配器对象：将记录日志到文件的功能适配成第二版需要的增删改查功能，这样就可以复用第一版的功能了；
 *     适配器通常是一个类，让适配器类去实现Target接口， 然后在适配器的具体实现里调用被适配的接口对象Adaptee.
 *     
 * 场景问题：如何让原有的电源类的接口能够适应新的硬盘类的电源接口的需要呢？同时支持数据库和文件的日志管理？
 * 解决方案：适配器模式：将一个类的接口转化成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作
 *     的那些类可以一起工作。
 * 
 * 适配器的本质：转换匹配，复用功能
 * 
 * 何时选用适配器模式：
 *     1.想要使用一个已经存在的类，但是它的接口不符合你的需求；
 *     2.创建一个可复用的类，这个类可能和一些不兼容的类一起工作；
 *     3.想使用一些已经存在的子类，但是不可能对每一个子类都进行适配，这种情况可选用对象适配器直接适配这些子类的父类即可；
 * @author taowei20061122@163.com
 *
 */
public class Adapter implements LogDbOperateApi {
	/**
	 * 持有需要被适配的接口对象
	 */
	private LogFileOperateApi adaptee;
	/**
	 * 构造方法，传入需要被适配的对象
	 * @param adaptee
	 */
	public Adapter(LogFileOperateApi adaptee) {
		this.adaptee = adaptee;
	}
	
	@Override
	public void createLog(LogModel lm) {
		//1.先读取文件的内容
		List<LogModel> list = adaptee.readLogFile();
		
		//2.加入新的日志对象
		list.add(lm);
		
		//3.重新写入文件
		adaptee.writeLogFile(list);
	}

	@Override
	public void updateLog(LogModel lm) {
		//1.先读取文件的内容
		List<LogModel> list = adaptee.readLogFile();
		
		//2.更新对象
		for (int i=0; i<list.size(); i++) {
			if (list.get(i).getLogId().equals(lm.getLogId())) {
				list.set(i, lm);
				break;
			}
		}
		//3.重新写入文件
		adaptee.writeLogFile(list);
	}

	@Override
	public void removeLog(LogModel lm) {
		//1.先读取文件的内容
		List<LogModel> list = adaptee.readLogFile();
		
		//2.加入新的日志对象
		list.remove(lm);
		
		//3.重新写入文件
		adaptee.writeLogFile(list);
	}

	@Override
	public List<LogModel> getAllLog() {
		return adaptee.readLogFile();
	}

}
